/* exif_lib.h - 纯C实现的EXIF写入库 */
#ifndef EXIF_LIB_H
#define EXIF_LIB_H

#include <stdint.h>
#include <stdlib.h>
#include <string.h>

/* EXIF标签定义 */
#define EXIF_TAG_MAKE             0x010F
#define EXIF_TAG_MODEL            0x0110
#define EXIF_TAG_ISO_SPEED        0x8827
#define EXIF_TAG_GPS_LAT_REF      0x0001
#define EXIF_TAG_GPS_LAT          0x0002
#define EXIF_TAG_GPS_LON_REF      0x0003
#define EXIF_TAG_GPS_LON          0x0004
#define EXIF_TAG_GPS_ALT_REF      0x0005
#define EXIF_TAG_GPS_ALT          0x0006

/* EXIF数据格式 */
#define EXIF_FORMAT_BYTE          1
#define EXIF_FORMAT_ASCII         2
#define EXIF_FORMAT_SHORT         3
#define EXIF_FORMAT_LONG          4
#define EXIF_FORMAT_RATIONAL      5

/* IFD类型定义 */
#define IFD0       0
#define EXIF_IFD   1
#define GPS_IFD    2


/* 分数类型 */
typedef struct {
    uint32_t numerator;   // 分子
    uint32_t denominator; // 分母
} ExifRational;

/* EXIF条目结构 */
typedef struct ExifEntry {
    uint16_t tag;         // 标签
    uint16_t format;      // 格式
    uint32_t components;  // 组件数量
    void *data;           // 数据
    size_t dataSize;      // 数据大小
    struct ExifEntry *next; // 下一个条目
} ExifEntry;

/* EXIF数据结构 */
typedef struct {
    ExifEntry *ifd0;      // IFD0条目
    ExifEntry *exifIfd;   // EXIF IFD条目
    ExifEntry *gpsIfd;    // GPS IFD条目
    uint8_t *buffer;      // 存储生成的EXIF数据
    size_t bufferSize;    // 缓冲区大小
} ExifData;

/* 创建新的EXIF数据 */
ExifData* exif_create();

/* 释放EXIF数据 */
void exif_destroy(ExifData *data);

/* 添加字符串类型的EXIF条目 */
void exif_add_string(ExifData *data, int ifd, uint16_t tag, const char *value);

/* 添加短整数类型的EXIF条目 */
void exif_add_short(ExifData *data, int ifd, uint16_t tag, uint16_t value);

/* 添加GPS坐标 */
void exif_add_gps(ExifData *data, double latitude, double longitude, double altitude);

/* 生成EXIF数据 */
int exif_generate(ExifData *data);

/* 将EXIF数据写入文件 */
int exif_write_file(ExifData *data, const char *filename);

/* 获取生成的EXIF数据 */
uint8_t* exif_get_data(ExifData *data, size_t *size);

/* 将EXIF数据插入到JPEG文件 */
int exif_insert_to_jpeg(const char *jpeg_filename, ExifData *data);

#endif /* EXIF_LIB_H */
